# -*- coding: UTF-8 -*- 

import math
import random
import time
import tkinter

class Helper(object):
    """ cette classe est utilisée de facon statique sans creer d'objet"""            
    def calcDistance(x1,y1,z1,x2,y2,z2):
        dx = (x2-x1)**2
        dy = (y2-y1)**2
        dz = (z2-z1)**2
        distance=math.sqrt(dx+dy+dz)
        return distance
    calcDistance = staticmethod(calcDistance)

"""classe copiée d'un Red Square"""        
class Chronometre():
    def __init__(self):
        self.depart = 0
        self.tempsEcoule = 0
        self.isOn = False
    
    def start(self):
        self.depart = time.time()
        self.isOn = True
        self.roulement()
        
    def stop(self):
        self.isOn = False
        
    def roulement(self):
        self.tempsEcoule=time.time()-self.depart
        return self.tempsEcoule
                
class Vaisseau:
    def __init__(self, id, iDjoueur, nom, vitesse, posx, posy, posz, atk, defense,sizex,sizey):
        self.nom = nom                  # nom du vaisseau
        self.flotte = 0                 # 
        self.id = id                    # numero d'identité
        self.iDjoueur = iDjoueur                # classe joueur auquel appartient le vaisseau
        self.kills = 0                  # nombre d'unité que le vaisseau à détruit
        self.vitesse = vitesse          # vitesse du vaisseau
        self.shield = 0                 # 
        self.costmin = 0                # 
        self.costfood = 0               # 
        self.costener = 0               # 
        self.constructiontime = 0       # temps nécéssaire pour construire le vaisseau
        self.posx = posx                # position actuelle en x
        self.posy = posy                # position actuelle en y
        self.posz = posz                # position actuelle en z
        self.destx = posx               # position de la destination en x
        self.desty = posy               # position de la destination en y
        self.destz = posz               # position de la destination en z
        self.sizex=sizex
        self.sizey=sizey

        """Position avant le deplacement"""
        self.oldx = posx
        self.oldy = posy
        self.oldz = posz
        
        self.capacite = 0               #
        self.target = 0                 #
        self.currenthp = 100            # quantité actuelle de points de "vie"
        self.maxhp = 100                # quantité maximale de points de "vie"
        self.regenhp = 2                # 
        self.regenshield =2             #
        self.upkeep = 0                 #
        self.atk = atk                  # puissance d'attaque
        self.defense = defense          # solidite
        self.distance = 0               # distance entre la position actuelle et las destination

        """Distance des pas"""
        self.pasx = 0
        self.pasy = 0
        self.pasz = 0
        
        self.canfight = False           # Vaisseau peut combattre?
        self.cancolonize = False        # Vaisseau peut coloniser?
        self.cantransport = False       # Vaisseau peut transporter?
        self.canbombard = False         # Vaisseau peut bombarder?
        self.canrepair = False          # Vaisseau peut reparer?
        self.canheal = False            # Vaisseau peut soigner?
        self.ismoving = False           # Vaisseau est en train de bouger?
        self.isbio = False              # 
        self.ismech = False             #
        self.isAttacking = False
        self.isAttacked = False
        self.isCombat = False
        self.isSelect=False
        self.cible = None
        
        self.listeUnites = []
        
    def setDestination(self, x, y, z):
        """On redéfinie destx, desty, destz. La distance est calculée"""
        self.destx = x
        self.desty = y
        self.destz = z
        self.distance = Helper.calcDistance(self.posx, self.posy, self.posz, self.destx, self.desty, self.destz)
        
        """Distance du parcours sur chaque axes"""
        dx = (self.destx - self.posx)
        dy = (self.desty - self.posy)
        dz = (self.destz - self.posz)
        
        """On redéfinie oldx, oldy et oldz pour la méthode compareDistances()"""
        self.oldx = self.posx
        self.oldy = self.posy
        self.oldz = self.posz
        
        pas = self.distance/self.vitesse
        if pas == 0:
            pas = 1
        self.pasx = dx / pas
        self.pasy = dy / pas
        self.pasz = dz / pas
        self.ismoving = True

                
    def deplacerVaisseau (self): 
        """On avance"""

        self.posx = self.posx + self.pasx
        self.posy = self.posy + self.pasy
        self.posz = self.posz + self.pasz
        self.compareDistances()
        
    
    def compareDistances(self):
        """La distance parcourru est comparé avec la distance à parcourir"""
        distParcouru = Helper.calcDistance(self.oldx, self.oldy, self.oldz, self.posx, self.posy, self.posz)
        
        
        
        if distParcouru >= self.distance:
            self.arriver()
    
    def arriver (self):
        """Le vaisseau est repositionné à sa destination s'il y arrive ou l'a dépasse"""
        self.posx = self.destx
        self.posy = self.desty
        self.posz = self.destz
        self.distance = 0
        self.pasx = 0
        self.pasy = 0
        self.pas = 0
        self.ismoving = False

    def arreterVaisseau (self):
        """Si le vaisseau est arrete pendant son parcours"""
        self.destx = self.posx
        self.desty = self.posy
        self.destz = self.posz
        self.distance = 0
        self.pasx = 0
        self.pasy = 0
        self.pasz = 0
        self.ismoving = False
        
    def attaquer(self,notreV,vaisseauEnnemi):
            if((abs(vaisseauEnnemi.posx-notreV.posx) <=111) and (abs(vaisseauEnnemi.posy-notreV.posy) <= 111)):
                vaisseauEnnemi.isAttacked= True
                notreV.isAttacking = True
                vaisseauEnnemi.currenthp -= notreV.atk
                return True
                
    
            else:
                vaisseauEnnemi.isAttacked= False
                notreV.isAttacking = False
                
                if(not(vaisseauEnnemi.posx+110 > notreV.posx and vaisseauEnnemi.posx-110 < notreV.posx)):
                    
                    if(vaisseauEnnemi.posx+110 < notreV.posx):
                        
                        if(vaisseauEnnemi.posy+110 < notreV.posy):
                            notreV.setDestination(vaisseauEnnemi.posx+110,vaisseauEnnemi.posy+110,notreV.posz)
                            
                        elif(vaisseauEnnemi.posy-110 > notreV.posy):
                            notreV.setDestination(vaisseauEnnemi.posx+110,vaisseauEnnemi.posy-110,notreV.posz)
                            
                        else:
                             notreV.setDestination(vaisseauEnnemi.posx+110,notreV.posy,notreV.posz)
                            
                    elif(vaisseauEnnemi.posx-110 > notreV.posx):
                        
                        if(vaisseauEnnemi.posy+110 < notreV.posy):
                            notreV.setDestination(vaisseauEnnemi.posx-110,vaisseauEnnemi.posy+110,notreV.posz)
                            
                        elif(vaisseauEnnemi.posy-110 > notreV.posy):
                            notreV.setDestination(vaisseauEnnemi.posx-110,vaisseauEnnemi.posy-110,notreV.posz)
                        
                        else:
                            notreV.setDestination(vaisseauEnnemi.posx-110,notreV.posy,notreV.posz)
                        
                else:
                 
                    if(vaisseauEnnemi.posy+110 < notreV.posy):
                        notreV.setDestination(notreV.posx,vaisseauEnnemi.posy+110,notreV.posz)
                        
                    elif(vaisseauEnnemi.posy-110 > notreV.posy):
                        notreV.setDestination(notreV.posx,vaisseauEnnemi.posy-110,notreV.posz)
    
            
